/**
 * 
 */
package com.skivingcloud.workflow.service;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

import org.activiti.bpmn.model.StartEvent;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.repository.Model;
import org.activiti.engine.repository.ProcessDefinition;
import org.springframework.web.multipart.MultipartFile;

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.skivingcloud.admin.sys.entity.User;
import com.skivingcloud.common.utils.PageUtils;
import com.skivingcloud.workflow.entity.ProcessVO;

/**
 * 流程模型设计
 * @author hushouquan
 *
 */
public interface ModelService {

	/**
	 * 分页查询模型
	 * @param params
	 * @param user 
	 * @return
	 */
	PageUtils list(Map<String, Object> params, User user);

	/**
	 * 初始化一个空的模型
	 * @param user 
	 * @return
	 */
	String newModel(User user);

	/**
	 * 根据id加载模型数据
	 * @param modelId
	 * @return
	 * @throws Exception 
	 */
	ObjectNode getEditorJson(String modelId) throws Exception;

	/**
	 * 删除一个空模型
	 * @param modelId
	 */
	void deleteNoneModel(String modelId);

	/**
	 * 根据id删除模型
	 * @param id
	 */
	void deleteModel(String id);

	/**
	 * 获取最新版的流程定义
	 * @return
	 */
	List<ProcessDefinition> getProcessOption();

	/**
	 * 修改模型
	 * @param modelId
	 * @param name
	 * @param description
	 * @param json_xml
	 * @param svg_xml
	 * @throws Exception 
	 */
	void saveModel(String modelId, String name, String description, String json_xml, String svg_xml) throws Exception;

	/**
	 * 发布模型
	 * @param id
	 * @param user
	 * @throws Exception 
	 */
	void deploy(String id, User user) throws Exception;

	/**
	 * 加载流程文件内容
	 * @param deploymentId
	 * @param resType 
	 * @param processDefinition 
	 * @return
	 */
	InputStream resourceRead(String deploymentId, String resType, ProcessDefinition processDefinition);

	/**
	 * 流程导入
	 * @param files
	 * @param user
	 * @throws Exception 
	 */
	void improtDeploy(List<MultipartFile> files, User user) throws Exception;
	
	/**
	 * 将流程转化为模型
	 * @param procDefId
	 * @return
	 * @throws Exception
	 */
	Model convertToModel(String procDefId) throws Exception;

	/**
	 * 获取开始节点信息用于组织页面表单
	 * @param defKey
	 * @return
	 */
	StartEvent getModelStartNodeInfo(String defKey);

	/**
     * 查询流程名称列表
	 * @param tenantId 
     *
     * @return
     */
	List<ProcessVO> getProcessNameList(String tenantId);
	
	/**
     * 获取进程 processDefinitionKey 的第一个节点定义
     *
     * @param processDefinitionKey
     * @return
     * @throws Exception
     */
    public ActivityImpl getFirstNode(String processDefinitionKey) throws Exception;
}
